物體偵測主要就做兩件事情:
物體偵測算是一個相對成熟的技術,現在主要手段還是透過深度學習訓練模型,在模型的訓練過程中,會需要分析大量的影像與物體相對應的位置與標示,才能在訓練結束後辨識影像中的物體。詳細的物體辨識介紹有些複雜,這篇文章不一一解說。目前效果最好的物體辨識模型之一 YOLO- You Only Look Once,而且不斷在進化,目前原作者認可的最新版本是 YOLOv4,其論文詳細說明物體偵測的步驟,有興趣的人可以到以下連結研究:
雖然物體偵測的模型有點複雜,但 Azure 有提供自己訓練出來的模型提供大家使用,不需要看論文,也不需要懂原理,只要會用 API 就好,後續就是要教大家如何利用 Azure 電腦視覺服務來偷懶。
Python
套件需要用到以下套件:
azure-cognitiveservices-vision-computervision
Pillow
requests
import os
from io import BytesIO
import requests
from PIL import Image, ImageDraw, ImageFont
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from msrest.authentication import CognitiveServicesCredentials
# 匯入必要套件,主要都是跟讀檔、繪圖和 Azure 的相關套件
# 一開始除了匯入套件以外,還需要利用金鑰SUBSCRIPTION_KEY和端點ENDPOINT,取得使用電腦視覺服務的權限。
SUBSCRIPTION_KEY = os.getenv("SUBSCRIPTION_KEY")
ENDPOINT = os.getenv("ENDPOINT")
CV_CLIENT = ComputerVisionClient(
ENDPOINT, CognitiveServicesCredentials(SUBSCRIPTION_KEY)
)
def main():
"""
Azure object detection
"""
# 透過圖片的 URL 取得圖片
url = "https://i.imgur.com/Js5H6Qa.jpg"
response = requests.get(url)
img = Image.open(BytesIO(response.content))
# 開始設定繪圖相關的部分,由於會需要在圖片上寫字,需要準備字型檔
draw = ImageDraw.Draw(img)
font_size = int(5e-2 * img.size[1])
fnt = ImageFont.truetype("../static/TaipeiSansTCBeta-Regular.ttf", size=font_size)
# 透過電腦視覺的功能取得物件,偵測的結果會包含匡出物體的左上角座標(x, y),以及方匡的寬跟高(w, h),過這四個值即可畫出方匡,並且標示辨識結果以及辨識的信心程度。
object_detection = CV_CLIENT.detect_objects(url)
if len(object_detection.objects) > 0:
for obj in object_detection.objects:
left = obj.rectangle.x
top = obj.rectangle.y
right = obj.rectangle.x + obj.rectangle.w
bot = obj.rectangle.y + obj.rectangle.h
name = obj.object_property
confidence = obj.confidence
print("{} at location {}, {}, {}, {}".format(name, left, right, top, bot))
draw.rectangle([left, top, right, bot], outline=(255, 0, 0), width=3)
draw.text(
[left, top + font_size],
"{0} {1:0.1f}".format(name, confidence * 100),
fill=(255, 0, 0),
font=fnt,
)
# 最後存檔
img.save("output.png")
print("Done!")
print("Please check ouptut.png")
if __name__ == "__main__":
main()
由於目前 Azure 電腦視覺的功能都只能輸入圖片的 URL,無法從自己的電腦輸入圖片,所以必須要找個地方上傳圖片,以便取得 URL。接下來,我們可以利用 Azure Blob 來取得圖片的連結。